From b804235aea791a65f1c50668c4bc43d27a4922e8 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 7 Apr 2019 17:19:09 +0000 Subject: [PATCH] Add a flags argument to gtk_widget_pick This will be used to let the inspector and other users pick insensitive widgets again. For now, update all callers to pass no flags, preserving the current behavior. --- demos/gtk-demo/dnd.c | 4 ++-- demos/gtk-demo/sliding_puzzle.c | 2 +- gtk/gtkenums.h | 4 ++++ gtk/gtkflowbox.c | 2 +- gtk/gtkmain.c | 4 ++-- gtk/gtkpointerfocus.c | 2 +- gtk/gtkrange.c | 4 ++-- gtk/gtktooltip.c | 2 +- gtk/gtkwidget.c | 23 +++++++++++++++-------- gtk/gtkwidget.h | 7 ++++--- gtk/gtkwindow.c | 9 +++++---- gtk/gtkwindowprivate.h | 7 ++++--- gtk/inspector/inspect-button.c | 2 +- tests/testwidgettransforms.c | 2 +- 14 files changed, 44 insertions(+), 30 deletions(-) diff --git a/demos/gtk-demo/dnd.c b/demos/gtk-demo/dnd.c index cb21d2f25b..7ee7591e74 100644 --- a/demos/gtk-demo/dnd.c +++ b/demos/gtk-demo/dnd.c @@ -243,7 +243,7 @@ pressed_cb (GtkGesture *gesture, GtkWidget *child; widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)); - child = gtk_widget_pick (widget, x, y); + child = gtk_widget_pick (widget, x, y, 0); if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_SECONDARY) { @@ -320,7 +320,7 @@ released_cb (GtkGesture *gesture, GtkWidget *child; widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)); - child = gtk_widget_pick (widget, x, y); + child = gtk_widget_pick (widget, x, y, 0); if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_PRIMARY) { diff --git a/demos/gtk-demo/sliding_puzzle.c b/demos/gtk-demo/sliding_puzzle.c index dd1bc65151..2cba018d27 100644 --- a/demos/gtk-demo/sliding_puzzle.c +++ b/demos/gtk-demo/sliding_puzzle.c @@ -228,7 +228,7 @@ puzzle_button_pressed (GtkGestureMultiPress *gesture, int l, t, i; int pos; - child = gtk_widget_pick (grid, x, y); + child = gtk_widget_pick (grid, x, y, 0); if (!child) { diff --git a/gtk/gtkenums.h b/gtk/gtkenums.h index 7eab7923e3..7f0a178ab8 100644 --- a/gtk/gtkenums.h +++ b/gtk/gtkenums.h @@ -1040,4 +1040,8 @@ typedef enum { GTK_PLACES_OPEN_NEW_WINDOW = 1 << 2 } GtkPlacesOpenFlags; +typedef enum { + GTK_PICK_ALL = 1 << 0 +} GtkPickFlags; + #endif /* __GTK_ENUMS_H__ */ diff --git a/gtk/gtkflowbox.c b/gtk/gtkflowbox.c index 1cb1683606..d134da1c69 100644 --- a/gtk/gtkflowbox.c +++ b/gtk/gtkflowbox.c @@ -3928,7 +3928,7 @@ gtk_flow_box_get_child_at_pos (GtkFlowBox *box, gint x, gint y) { - GtkWidget *child = gtk_widget_pick (GTK_WIDGET (box), x, y); + GtkWidget *child = gtk_widget_pick (GTK_WIDGET (box), x, y, 0); if (!child) return NULL; diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 2c61209eac..e00cc59497 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1703,7 +1703,7 @@ handle_pointing_event (GdkEvent *event) target = gtk_window_lookup_pointer_focus_implicit_grab (toplevel, device, sequence); if (!target) - target = gtk_widget_pick (toplevel_widget, x, y); + target = gtk_widget_pick (toplevel_widget, x, y, 0); if (!target) target = toplevel_widget; @@ -1742,7 +1742,7 @@ handle_pointing_event (GdkEvent *event) if (event->any.type == GDK_BUTTON_RELEASE) { GtkWidget *new_target; - new_target = gtk_widget_pick (GTK_WIDGET (toplevel), x, y); + new_target = gtk_widget_pick (GTK_WIDGET (toplevel), x, y, 0); if (new_target == NULL) new_target = GTK_WIDGET (toplevel); gtk_synthesize_crossing_events (GTK_ROOT (toplevel), target, new_target, event, diff --git a/gtk/gtkpointerfocus.c b/gtk/gtkpointerfocus.c index 6c2c90f455..cb338a11e8 100644 --- a/gtk/gtkpointerfocus.c +++ b/gtk/gtkpointerfocus.c @@ -135,7 +135,7 @@ gtk_pointer_focus_repick_target (GtkPointerFocus *focus) { GtkWidget *target; - target = gtk_widget_pick (GTK_WIDGET (focus->toplevel), focus->x, focus->y); + target = gtk_widget_pick (GTK_WIDGET (focus->toplevel), focus->x, focus->y, 0); if (target == NULL) target = GTK_WIDGET (focus->toplevel); gtk_pointer_focus_set_target (focus, target); diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c index 586561917e..9b430d79c9 100644 --- a/gtk/gtkrange.c +++ b/gtk/gtkrange.c @@ -1865,7 +1865,7 @@ gtk_range_long_press_gesture_pressed (GtkGestureLongPress *gesture, GtkRangePrivate *priv = gtk_range_get_instance_private (range); GtkWidget *mouse_location; - mouse_location = gtk_widget_pick (GTK_WIDGET (range), x, y); + mouse_location = gtk_widget_pick (GTK_WIDGET (range), x, y, 0); if (mouse_location == priv->slider_widget && !priv->zoom) { @@ -1909,7 +1909,7 @@ gtk_range_multipress_gesture_pressed (GtkGestureMultiPress *gesture, "gtk-primary-button-warps-slider", &primary_warps, NULL); - mouse_location = gtk_widget_pick (widget, x, y); + mouse_location = gtk_widget_pick (widget, x, y, 0); /* For the purposes of this function, we ignore fill and highlight and * handle them like the trough */ diff --git a/gtk/gtktooltip.c b/gtk/gtktooltip.c index f309fc7683..fafc80c8be 100644 --- a/gtk/gtktooltip.c +++ b/gtk/gtktooltip.c @@ -434,7 +434,7 @@ _gtk_widget_find_at_coords (GdkSurface *surface, if (!event_widget) return NULL; - picked_widget = gtk_widget_pick (event_widget, surface_x, surface_y); + picked_widget = gtk_widget_pick (event_widget, surface_x, surface_y, 0); if (picked_widget != NULL) gtk_widget_translate_coordinates (event_widget, picked_widget, surface_x, surface_y, widget_x, widget_y); diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 39ac2bd10b..f7b2087914 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -11006,6 +11006,7 @@ gtk_widget_contains (GtkWidget *widget, * @widget: the widget to query * @x: X coordinate to test, relative to @widget's origin * @y: Y coordinate to test, relative to @widget's origin + * @flags: Flags to influence what is picked * * Finds the descendant of @widget (including @widget itself) closest * to the screen at the point (@x, @y). The point must be given in @@ -11024,20 +11025,26 @@ gtk_widget_contains (GtkWidget *widget, * coordinate or %NULL if none. **/ GtkWidget * -gtk_widget_pick (GtkWidget *widget, - gdouble x, - gdouble y) +gtk_widget_pick (GtkWidget *widget, + gdouble x, + gdouble y, + GtkPickFlags flags) { GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget); GtkWidget *child; g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); - if (!gtk_widget_get_can_pick (widget) || - !_gtk_widget_is_sensitive (widget) || - !_gtk_widget_is_drawable (widget)) + if (!_gtk_widget_is_drawable (widget)) return NULL; + if ((flags & GTK_PICK_ALL) == 0) + { + if (!gtk_widget_get_can_pick (widget) || + !_gtk_widget_is_sensitive (widget)) + return NULL; + } + switch (priv->overflow) { default: @@ -11061,7 +11068,7 @@ gtk_widget_pick (GtkWidget *widget, { GtkWidget *picked; - picked = gtk_window_pick_popover (GTK_WINDOW (widget), x, y); + picked = gtk_window_pick_popover (GTK_WINDOW (widget), x, y, flags); if (picked) return picked; } @@ -11097,7 +11104,7 @@ gtk_widget_pick (GtkWidget *widget, graphene_point3d_interpolate (&p0, &p1, p0.z / (p0.z - p1.z), &res); - picked = gtk_widget_pick (child, res.x, res.y); + picked = gtk_widget_pick (child, res.x, res.y, flags); if (picked) return picked; } diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index 5424d2182d..8f0591306b 100644 --- a/gtk/gtkwidget.h +++ b/gtk/gtkwidget.h @@ -751,9 +751,10 @@ gboolean gtk_widget_contains (GtkWidget *widget, gdouble x, gdouble y); GDK_AVAILABLE_IN_ALL -GtkWidget * gtk_widget_pick (GtkWidget *widget, - gdouble x, - gdouble y); +GtkWidget * gtk_widget_pick (GtkWidget *widget, + gdouble x, + gdouble y, + GtkPickFlags flags); GDK_AVAILABLE_IN_ALL void gtk_widget_add_controller (GtkWidget *widget, diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index ab7dc0419a..ce1ab54dc0 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -736,9 +736,10 @@ static void popover_get_rect (GtkWindowPopover *popover, cairo_rectangle_int_t *rect); GtkWidget * -gtk_window_pick_popover (GtkWindow *window, - double x, - double y) +gtk_window_pick_popover (GtkWindow *window, + double x, + double y, + GtkPickFlags flags) { GtkWindowPrivate *priv = gtk_window_get_instance_private (window); GList *popovers; @@ -753,7 +754,7 @@ gtk_window_pick_popover (GtkWindow *window, x, y, &dest_x, &dest_y); - picked = gtk_widget_pick (popover->widget, dest_x, dest_y); + picked = gtk_widget_pick (popover->widget, dest_x, dest_y, flags); if (picked) return picked; } diff --git a/gtk/gtkwindowprivate.h b/gtk/gtkwindowprivate.h index 67e3973c10..555f5faa6f 100644 --- a/gtk/gtkwindowprivate.h +++ b/gtk/gtkwindowprivate.h @@ -162,9 +162,10 @@ void gtk_window_maybe_revoke_implicit_grab (GtkWindow *window, void gtk_window_maybe_update_cursor (GtkWindow *window, GtkWidget *widget, GdkDevice *device); -GtkWidget * gtk_window_pick_popover (GtkWindow *window, - double x, - double y); +GtkWidget * gtk_window_pick_popover (GtkWindow *window, + double x, + double y, + GtkPickFlags flags); G_END_DECLS diff --git a/gtk/inspector/inspect-button.c b/gtk/inspector/inspect-button.c index 76e52f4df1..430d3c49e5 100644 --- a/gtk/inspector/inspect-button.c +++ b/gtk/inspector/inspect-button.c @@ -55,7 +55,7 @@ find_widget_at_pointer (GdkDevice *device) gdk_surface_get_device_position (gtk_widget_get_surface (widget), device, &x, &y, NULL); - widget = gtk_widget_pick (widget, x, y); + widget = gtk_widget_pick (widget, x, y, 0); } return widget; diff --git a/tests/testwidgettransforms.c b/tests/testwidgettransforms.c index 1dd8d2c1ad..314d72c01d 100644 --- a/tests/testwidgettransforms.c +++ b/tests/testwidgettransforms.c @@ -187,7 +187,7 @@ gtk_transform_tester_snapshot (GtkWidget *widget, const float py = y; GtkWidget *picked; #if 1 - picked = gtk_widget_pick (widget, px, py); + picked = gtk_widget_pick (widget, px, py, 0); #else { int dx, dy; -- 2.30.2